#include "test_common.hpp"
#include "tools/api.hpp"
#include <opencv2/opencv.hpp>
#include <fstream>
#include <filesystem>

void test_load_image()
{
    std::string testDir = test_common::getTestTempDir();
    std::string imageFile = testDir + "/test_image.png";
    test_common::cleanupTestDir(testDir);
    
    MKDIR(testDir);
    
    // 创建一个简单的测试图像
    cv::Mat testImage(100, 100, CV_8UC3, cv::Scalar(255, 0, 0));  // 蓝色图像
    cv::imwrite(imageFile, testImage);
    
    // 测试加载图像
    cv::Mat loadedImage = LOAD_IMAGE(imageFile);
    ASSERT_TRUE(!loadedImage.empty());
    ASSERT_EQ(loadedImage.rows, 100);
    ASSERT_EQ(loadedImage.cols, 100);
    
    test_common::cleanupTestDir(testDir);
}

void test_save_image()
{
    std::string testDir = test_common::getTestTempDir();
    std::string imageFile = testDir + "/saved_image.png";
    test_common::cleanupTestDir(testDir);
    
    MKDIR(testDir);
    
    // 创建一个测试图像
    cv::Mat testImage(50, 50, CV_8UC3, cv::Scalar(0, 255, 0));  // 绿色图像
    
    // 测试保存图像
    bool success = SAVE_IMAGE(testImage, imageFile);
    ASSERT_TRUE(success);
    
    // 验证文件是否存在
    ASSERT_TRUE(std::filesystem::exists(imageFile));
    
    // 验证可以重新加载
    cv::Mat loadedImage = cv::imread(imageFile);
    ASSERT_TRUE(!loadedImage.empty());
    
    test_common::cleanupTestDir(testDir);
}

void test_load_first_image()
{
    std::string testDir = test_common::getTestTempDir();
    test_common::cleanupTestDir(testDir);
    
    MKDIR(testDir);
    
    // 创建多个图像文件
    cv::Mat testImage1(10, 10, CV_8UC3, cv::Scalar(255, 0, 0));
    cv::Mat testImage2(10, 10, CV_8UC3, cv::Scalar(0, 255, 0));
    cv::imwrite(testDir + "/image1.png", testImage1);
    cv::imwrite(testDir + "/image2.jpg", testImage2);
    
    // 测试加载第一个图像
    cv::Mat loadedImage = LOAD_FIRST_IMAGE(testDir);
    ASSERT_TRUE(!loadedImage.empty());
    
    test_common::cleanupTestDir(testDir);
}

void test_compare_images()
{
    std::string testDir = test_common::getTestTempDir();
    test_common::cleanupTestDir(testDir);
    
    MKDIR(testDir);
    
    // 创建两个相同的图像
    cv::Mat image1(50, 50, CV_8UC3, cv::Scalar(128, 128, 128));
    cv::Mat image2(50, 50, CV_8UC3, cv::Scalar(128, 128, 128));
    
    // 比较相同图像
    cv::Mat result = COMPARE_IMAGES(image1, image2);
    ASSERT_TRUE(!result.empty());
    
    // 创建两个不同的图像
    cv::Mat image3(50, 50, CV_8UC3, cv::Scalar(255, 0, 0));
    cv::Mat image4(50, 50, CV_8UC3, cv::Scalar(0, 255, 0));
    
    // 比较不同图像
    cv::Mat result2 = COMPARE_IMAGES(image3, image4);
    ASSERT_TRUE(!result2.empty());
    
    test_common::cleanupTestDir(testDir);
}

int main()
{
    auto& runner = test_common::TestRunner::getInstance();
    runner.reset();
    
    std::cout << "=== Running Image Module Tests ===" << std::endl;
    
    runner.runTest("test_load_image", test_load_image);
    runner.runTest("test_save_image", test_save_image);
    runner.runTest("test_load_first_image", test_load_first_image);
    runner.runTest("test_compare_images", test_compare_images);
    
    std::cout << "\n=== Test Results ===" << std::endl;
    std::cout << "Total: " << runner.getTotal() << std::endl;
    std::cout << "Passed: " << runner.getPassed() << std::endl;
    std::cout << "Failed: " << runner.getFailed() << std::endl;
    
    return runner.getFailed() == 0 ? 0 : 1;
}

